const dayjs = require("../../libs/dayjs/dayjs.min.js");

const Default_Append_Count = 6;

/**
 * 获取指定日期之后的周列表数据
 * @param {Date} date - 基准日期 Date对象
 * @param {number} [count=Default_Append_Count] - 需要获取的周数量
 * @returns {Array} 返回包含指定数量周数据的数组
 */
export function getForwardWeekListData(date, count = Default_Append_Count) {
	return getWeekListData(date, count, 'forward');
}

/**
 * 获取指定日期之前的周列表数据
 * @param {Date} date - 基准日期 Date对象
 * @param {number} [count=Default_Append_Count] - 需要获取的周数量
 * @returns {Array} 返回包含指定数量周数据的数组
 */
export function getBackwardWeekListData(date, count = Default_Append_Count) {
	return getWeekListData(date, count, 'backward');
}

/**
 * 获取指定日期前后若干周的周数据列表
 * @param {Date} date - 基准日期
 * @param {number} [count=Default_Append_Count] - 要获取的周数
 * @param {string} [type='forward'] - 获取方向：'forward'获取后续周，'backward'获取之前周
 * @param {Array} [result=[]] - 递归使用的中间结果数组
 * @returns {Array} 周数据列表
 * @throws {Error} 当type参数不合法时抛出错误
 */
export function getWeekListData(date, count = Default_Append_Count, type = 'forward', result = []) {
	if (count <= 0) return result; // 如果count <= 0 已经跑完递归次数 停止递归算法，返回运算结果
	let weekItem = getWeekItemData(date); // 获取日期对应的周数据列表
	let nextDate;
	switch (type) {
		case "forward":
			result.push(weekItem); // 因为是获取之后的日期数据，所以使用 push 插入列表尾部
			nextDate = dayjs(date).day(7).toDate(); // 获取下周一日期
			break;
		case "backward":
			result.unshift(weekItem); // 因为是获取之前的日期数据，所以使用 unshift 插入列表头部
			nextDate = dayjs(date).day(-1).toDate(); // 获取上周六日期  因为默认一周是从周日开始到周六结束，如果使用day(0)获取周日依旧会获取当前周的数据
			break;
		default:
			throw new Error('getWeekListData unknow type');
	}
	count--;
	// 递归调用，继续生成 上周、下周 数据
	return getWeekListData(nextDate, count, type, result);
}

/**
 * 获取指定日期的周数据项
 * @param {Date} date - 要查询的日期对象
 * @returns {Array} 返回该日期对应的周日期列表
 */
export function getWeekItemData(date) {
	let currentDate = new Date();
	if (!date) date = currentDate;
	let result = [];
	let i = 0; // 从星期一开始 -2 上周五 -1 上周六 | 0 本周日 | ... | 6 本周六 | 7 下周日 | 8 下周 一 
	while (i < 7) { // 从 1 到 7
		let dayItem = dayjs(date).day(i).toDate();
		result.push(new DayItem(dayItem));
		i++;
	}
	return result;
}

/**
 * DayItem 对象
 */
export class DayItem {
	/**
	 * 构造函数，初始化日期相关属性
	 * @param {Date} [date] - 可选日期参数，默认为当前日期
	 * @property {Date} date - 日期对象
	 * @property {String} year - 格式化年份(YYYY)
	 * @property {String} week - 星期几的缩写(ddd)
	 * @property {String} formatDate - 格式化日期(MM-DD)
	 * @property {String} formatDateFull - 完整格式化日期(YYYY-MM-DD)
	 * @property {Number} dayStatus - 日期状态(-1:过去, 0:当天, 1:未来)
	 */
	constructor(date) {
		let currentDate = new Date();
		if (!date) date = currentDate;
		let dayItem = date;
		let dayjsObj = dayjs(dayItem);
		let dayStatus = dayjsObj.isBefore(currentDate, "day") ? -1 : dayjsObj.isAfter(currentDate, "day") ? 1 :
		0; // pass day == -1 | current day == 0 | future day == 1
		this.date = dayItem;
		this.year = dayjsObj.format('YYYY');
		this.week = dayjsObj.format('ddd');
		this.formatDate = dayjsObj.format('MM-DD');
		this.formatDateFull = dayjsObj.format('YYYY-MM-DD');
		this.dayStatus = dayStatus;
	}
}